#ifndef PRODUCT_CONFIG_H
#define PRODUCT_CONFIG_H
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"

#define ARCH_OS_NATIVE_PRIORITY_DEFAULT (configMAX_PRIORITIES -1)

//用户处理时候的OTA任务,优先级最高
#define TASK_PROP_OTA  	  (ARCH_OS_NATIVE_PRIORITY_DEFAULT)

//处理串口数据优先级次高
#define TASK_PROP_UART  	  (ARCH_OS_NATIVE_PRIORITY_DEFAULT-1)

//网络相关任务优先级最高
#define TASK_PROP_NET (ARCH_OS_NATIVE_PRIORITY_DEFAULT-1)

//UI显示任务优先级第3高
#define TASK_PROP_DISPLAY (ARCH_OS_NATIVE_PRIORITY_DEFAULT-2)

//处理缓存区数据优先级第3高
#define TASK_PROP_CACHE (ARCH_OS_NATIVE_PRIORITY_DEFAULT-2)

//底层驱动及信号检测的优先级第4
#define TASK_PROP_DRIVER (ARCH_OS_NATIVE_PRIORITY_DEFAULT-3)

//app逻辑处理任务的优先级排第4
#define TASK_PROP_APP (ARCH_OS_NATIVE_PRIORITY_DEFAULT-3)

//同IOT平台的交互,任务优先级排第5
#define TASK_PROP_IOTTALK (ARCH_OS_NATIVE_PRIORITY_DEFAULT-4)

//定义方便识别的 类型    
typedef uint8_t     u8;
typedef int8_t      s8;
typedef uint8_t     vu8;
typedef char        uc8;

typedef uint16_t    u16;
typedef int16_t     s16;
typedef uint16_t    vu16;
typedef int16_t     vs16;
typedef uint16_t    uc16;

typedef uint32_t    u32;
typedef uint64_t u64;
typedef uint32_t    uc32;
typedef uint32_t    vu32;
typedef int32_t     s32;

#define LEVEL 10 //亮度等级

#define APP_LOGIC_SIZE 4096
#define CACHE_LOGIC_SIZE 5120
#define LIGHT_EFFECT_LOOP_SIZE 3072
#define SENSOR_DECT_SIZE 2048
#define UART_SZIE 3072
#define WIFI_LOGIC_SIZE 4096
#define SPI_DISPALY_SIZE 4096
#define TCP_LOGIC_SZIE 3072
#define REPORT_LOGIC_SZIE 4096
#define PWM_LOGIC_SIZE 3072

#define BUF_SIZE 1024

#define LED_NUMBER 78 //灯珠的数量

#define EXAMPLE_CHASE_SPEED_MS      10 //休眠时间10ms
#define WIFI_LOOP_SPEED_MS      50 //休眠时间50ms

#define CUSTOM_LOCA 0x2000
#define CUSTOM_ADD 0x1000
/********************************保存用的编码*******************************************/
#define CUSTOM_NVS_PART_LABEL "custom_nvs"
#define CUSTOM_NVS_PART_NAMESPACE   "storage"
#define WIFI_SSID "wifi_ssid" //wifi名称
#define WIFI_PSWD "wifi_pswd" //wifi密码

#define APP_STATUS "app_status" //逻辑状态
#define BRIGH_LEVEL "brigh_level" //灯光亮度信息
#define MICROSENST "micro_senst" //麦克风灵敏度
#define SPECTRALMODE "spectral_mode" //音频模式
#define MODESCENE "scene_mode" //场景模式
#define CUSTOMSSP "custom_ssp" //自定义工作模式子模式
#define CW_LEVEL "cw_level" //cw 色温等级
#define CW_BRIGH "cw_brigh" //cw 亮度等级

#define PART_LOCA 0x1000  //分段模式存储位置
/*******************************网络编码****************************************/
#define REGISTER 0X00000000 //注册包
#define INQUIRE 0X00000001 //查询指令
#define ACK 0X00000002 //回报帧
#define CUSTOM_PART_DATA 0xAA010001 //自定分段信息
#define MICRO_SENST 0xaa020000 //麦克风灵敏度
#define SCENE_SENST 0xaa020001 //场景模式灵敏度
#define CUSTOM_WAIT 0xAA030000 //自定义延时时间
#define CUSTOM_SAVE 0xAA040000 //自定以保存模式
#define PART_DATA 0xAA010000 //分段信息
#define MAIN_MODE 0xAAAA0000 //主模式

#define SPECTRAL_MODE 0XAAAA0001 //麦克风模式子模式
#define CUSTOM_SSP 0xAAAA0002 //自定义工作模式
#define EFFECT_SSP 0xAAAA0003 //自定义灯光效果模式
#define SCENE_MODE 0XAAAA0006 //场景模式
#define OPEN_CLOSE 0xAAAA0007 //开关机
#define RGB_BRIGHNESS 0xAABB0001//灯带亮度调节
#define LEVEL_CW 0XAABB0002 //CW色温值
#define BRIGHNESS_CW 0XAABB0003 //CW亮度
#define HIGH_SPEED 0XAADD0000 //高速模式包
#define NET_RESET 0xBBAA0000
#define OTA 0xFF000000 //进入OTA模式
#define HEARTBEAT_PACKET 0xFFFFFFFF  //心跳包

/**********************BLUFI 配网部分**********************/
typedef enum
{
    WIFI_POWER_OFF,     //0WIFI蓝牙关闭状态，对应节能模式
    BULFI_OPEN,     //1 bulfi开启状态，正在配网中
    BULFI_CONNECT_OUT,  //2 blufi连接超时
    WIFI_CONNECTING,    //3 WIFI连接中
    WIFI_CONNECTED,     //4 WIFI连接完成
    NUM_WIFI_SSP,       //5 WIFI状态枚举值
}EM_WIFI_SSP; //wifi状态信息

typedef struct 
{
  void (*handle)(void);
}WIFI_MODE; //指针函数，用于控制灯带模式切换 

typedef struct 
{
    EM_WIFI_SSP wifi_ssp;
    EM_WIFI_SSP last_wifi_ssp;
}WIFI_SYS; //wifi状态

/*应用逻辑部分*/
typedef enum
{
    SSP_NONE, //0号状态
    SSP_POWER_OFF,//1 对应灯带不亮状态
    SSP_LOGO,//2 对应开机状态
    SSP_MODE_SCENE,//3场景模式
    SSP_MODE_MIC, //4麦克风模式
    SSP_MODE_PART, //5分段模式
    SSP_MODE_CUSTOM, //6自定义模式
    SSP_MODE_CW, //7 CW调色模式
    SSP_HIGH_SPEED,//8 高速模式
    NUM_SYS_SSP,//状态枚举值
}EM_SYS_SSP; //系统状态信息

typedef struct 
{
    EM_SYS_SSP lastssp;
    EM_SYS_SSP ssp;
    EM_SYS_SSP recssp;
}ST_SYS;

/****************按键切换部分*********************/
#define MAX_BRIGHT 100
#define MIN_BRIGH 0
#define LIGHT_LEVEL 10 //每次加减6
#define LIGHT_CONTINUE 1//每次加减1

typedef enum
{
    OPT_NONE,//0
    OPT_POWER_TURNON, //1 开机操作
    OPT_POWER_TURNOFF, //2 关机操作
    OPT_GO_NEXT, //3 下一步
    OPT_GO_ADD, //4 增加
    OPT_GO_ADD_CONTINUE, //5 持续增加
    OPT_GO_REDUCE,//6 减小
    OPT_GO_REDUCE_CONTINUE, //7 持续减小
    OPT_GO_MIC,//8 进入麦克风
    OPT_OUT_MIC, //9 退出麦克风
    OPT_INVALID,//10 无效操作
    OPT_MATCH_NET, //11 开始配网
    OPT_GO_CW, //12 进入CW模式
    OPT_OUT_CW,//13 退出CW模式
    OPT_PREE_TR, //14 按压右转
    OPT_PREE_TL, //15 按压左转
    NUM_APP_OPT,//12 操作枚举值
}EM_APP_OPT;

typedef struct 
{
    EM_APP_OPT oepation;
}SYS_OPT_KEY;

typedef struct
{
    void (*handle)(SYS_OPT_KEY opt);
}light_MODE; //指针函数，用于控制灯带模式切换 

/***************************spi发送程序**************************************/
typedef struct 
{
    u8 *send_data; //待发送数据内容
    u16 send_len; //待发送数据长度
}spi_send_param; //spi口发送数据参数

/************************麦克风相关*****************************************/
typedef enum
{
    MICRO_ENERGY=1, //1 麦克风-能量
    MICRO_PIANO=7,//7 钢琴键
    MICRO_SHINY=11, //11 麦克风-发光的
    NUM_MICRO_SSP,  //12 麦克风状态枚举值
}EM_MICRO_SSP; //麦克风状态信息

typedef struct 
{
  void (*handle)(u8 value);
}MICRO_MODE; //指针函数，用于控制麦克风模式

typedef struct 
{
    EM_MICRO_SSP lastssp;
    EM_MICRO_SSP ssp;
    EM_MICRO_SSP recssp;
}MICRO_SYS;

/*********************自定义及场景相关************************************/
typedef struct 
{
    u8 light_effect_ssp;
    u8 wait;
    u8 len;
    u8 buf[45];
}LIGHT_EFFECT_T;

typedef struct 
{
    u8 lastssp;
    u8 ssp;
    u8 recssp;
}CUSTOM_SYS; //自定义模式子状态

typedef enum
{
    EFFECT_ZERO=0,//灯效0 
    EFFECT_FADE, //淡入淡出
    EFFECT_FADE_OUT, //淡出
    EFFECT_FADE_IN, //淡入
    EFFECT_MARQUEE_COUNTER_CLOCKWISE, //跑马逆时针
    EFFECT_MARQUEE_CLOCKWISE, //跑马顺时针
    EFFECT_FLICKER_ALL, //全频闪烁
    EFFECT_FLICKER_SUBSECTION, //分频闪烁
    EFFECT_WATERFALL, //流水向前
    EFFECT_WATERALL_COUNTER, //流水向后
    RAINBOW_REVERSE, //彩虹反向
    RAINBOW_FORWARD, //彩虹灯正向
    EFFECT_ENUM,
}LIGHT_EFFECT_MODE;

typedef struct 
{
    void (*handle)(uint8_t num,uint8_t wait,uint8_t len,uint8_t *buff);
}LIGHT_EFFECT;


/*************************场景模式子模式**************************************/
typedef enum
{
    SCENE_ZERO, //0号
    AUROAR_MODE, //1极光模式
    CANDLELIGHT_MODE,//2烛光模式
    BIRTHDAY_MODE,//3生日模式
    METEROR_MODE,//4流星
    REST_MODE,//5睡觉
    MEDITATION_MODE,//6冥想
    FLAME_MODE,//7火焰
    BUSINESS_MODE,//8商务
    ALARM_MODE,//9警报
    TIDE_MODE,//10潮汐
    ELETROUIC_MUSIC_MODE,//11电子音乐
    UNIVERSE_MODE,//12宇宙
    SCENE_MODE_NUM,
}EM_SCENE_SSP;

typedef struct 
{
    void (*handle)(void);
}SCENE_HANDLE; //场景模式子处理函数

typedef struct 
{
    EM_SCENE_SSP ssp;
    EM_SCENE_SSP last_ssp;
}SCENE_SYS;

/***************************数据解析相关**********************************/
#define PACKET_HEADER 0xa5

typedef enum
{
    NONE_SOURCE=0, //没有源
    UART_SOURCE, //串口源
    TCP_SOURCE, //网络源
    NUM_SOURCE, 
}DATA_SOURCE; //数据源

typedef struct 
{
    DATA_SOURCE source; //数据来源
    u16 len; //待发送数据长度
    u8 *data; //待发送数据内容
}cache_param; //spi口发送数据参数

typedef struct 
{
    u16 length;
    u8 *data;
}PACKET; //解析包的数据
/*****************分段模式相关****************************/
#define PART_NUM 39
#define PART_BUFF 117// PART_NUM*3


typedef struct 
{
    u8 len;
    u8 RGB[PART_BUFF];
}PART_INFO_T;
/*******************CW亮度调节**********************************/
typedef struct 
{
    u8 cw; //黄光
    u8 w;  //白光
    u8 brighness; //亮度 
}CW_BRIGHNESS; //cw 亮度调节

/*******************侧边灯带**********************************/

#define SIDE_LIGHT_STRIP_NUM 18

#endif





















